package com.example.springboot3demo.mq;

import com.example.springboot3demo.config.RabbitMQConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * RabbitMQ消息生产者
 * 
 * 该类负责向RabbitMQ发送消息，支持多种消息发送方式：
 * 1. 发送简单文本消息
 * 2. 发送带有自定义路由键的消息
 * 3. 发送对象消息（自动序列化为JSON）
 * 
 * 使用Spring的RabbitTemplate作为核心组件进行消息发送
 */
@Service
public class MessageProducer {
    
    /** RabbitTemplate用于发送消息 */
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    /**
     * 发送消息到默认队列
     * 
     * @param message 消息内容
     */
    public void sendMessage(String message) {
        // 使用默认的交换机、路由键发送消息
        rabbitTemplate.convertAndSend(
            RabbitMQConfig.EXCHANGE_NAME, 
            RabbitMQConfig.ROUTING_KEY, 
            message
        );
        System.out.println("[x] Sent message: '" + message + "'");
    }
    
    /**
     * 发送消息到指定路由键
     * 
     * @param routingKey 路由键
     * @param message 消息内容
     */
    public void sendMessage(String routingKey, String message) {
        // 使用默认交换机和指定路由键发送消息
        rabbitTemplate.convertAndSend(
            RabbitMQConfig.EXCHANGE_NAME, 
            routingKey, 
            message
        );
        System.out.println("[x] Sent message: '" + message + "' with routing key: '" + routingKey + "'");
    }
    
    /**
     * 发送对象消息
     * 
     * 对象会被自动序列化为JSON格式进行传输
     * 
     * @param routingKey 路由键
     * @param object 消息对象
     */
    public void sendObjectMessage(String routingKey, Object object) {
        // 发送对象消息，会自动使用Jackson2JsonMessageConverter进行序列化
        rabbitTemplate.convertAndSend(
            RabbitMQConfig.EXCHANGE_NAME, 
            routingKey, 
            object
        );
        System.out.println("[x] Sent object message with routing key: '" + routingKey + "'");
    }
    
    /**
     * 发送对象消息到指定交换机
     * 
     * 对象会被自动序列化为JSON格式进行传输
     * 
     * @param exchange 交换机名称
     * @param routingKey 路由键
     * @param object 消息对象
     */
    public void sendObjectMessage(String exchange, String routingKey, Object object) {
        // 发送对象消息到指定交换机，会自动使用Jackson2JsonMessageConverter进行序列化
        rabbitTemplate.convertAndSend(
            exchange, 
            routingKey, 
            object
        );
        System.out.println("[x] Sent object message to exchange: '" + exchange + "' with routing key: '" + routingKey + "'");
    }
}